import axios, { AxiosRequestConfig, Canceler } from 'axios'

const pendingMap = new Map<string, Canceler>()

// 生成每个请求唯一的键
function getPendingKey(config: AxiosRequestConfig): string {
  const { url, method, params, data } = config
  const dataString = typeof data === 'string' ? JSON.parse(data) : data
  return [url, method, JSON.stringify(params), JSON.stringify(dataString)].join('&')
}

// 存储每个请求的唯一值
function addPendingKey(config: AxiosRequestConfig): void {
  const pendingKey = getPendingKey(config)
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken(cancel => {
      if (!pendingMap.has(pendingKey)) {
        pendingMap.set(pendingKey, cancel)
      }
    })
}

// 取出重复请求并且删除
function removePendingKey(config: AxiosRequestConfig): void {
  const pendingKey = getPendingKey(config)
  if (pendingMap.has(pendingKey)) {
    const cancelToken = pendingMap.get(pendingKey)
    if (cancelToken) {
      cancelToken(pendingKey) // 取消请求
      pendingMap.delete(pendingKey)
    }
  }
}

// 导出方法
export { addPendingKey, removePendingKey }
